package ar.edu.utn.frba.disenio.aterrizar.ui.arena;

import java.util.ArrayList;

import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.OperadorAerolineas;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.Vuelo;
import ar.edu.utn.frba.disenio.aterrizar.busquedas.CriterioBusqueda;
import ar.edu.utn.frba.disenio.aterrizar.excepciones.AsientoNoDisponibleException;
import ar.edu.utn.frba.disenio.aterrizar.excepciones.NoEsParseablePorFormatoException;
import ar.edu.utn.frba.disenio.aterrizar.fechas.Latinoamericano;
import ar.edu.utn.frba.disenio.aterrizar.ui.arena.repociudades.Ciudad;
import ar.edu.utn.frba.disenio.aterrizar.usuario.UsuarioEstandar;

@Observable
public class BuscadorAsientos {
 
	public BuscadorAsientos(UsuarioEstandar user){
		this.usuario = user;
		resultados = new ArrayList<Vuelo>();
		this.setNombre(user.getNombre());
		this.setApellido(user.getApellido());
	}	
	
	private Ciudad origen;
	private Ciudad destino;
	private String fecha;
	private ArrayList<Vuelo> resultados;
	private Vuelo vueloSeleccionado;
	private UsuarioEstandar usuario;
	private OperadorAerolineas operador = OperadorAerolineas.getInstance();
	private String nombre;
	private String apellido;
	
	public void search() {
		
		if(origen!= null && destino!=null && !fecha.isEmpty()){
			this.setResultados(operador.buscarVuelos(new CriterioBusqueda(this.origen.codigoCiudad, this.destino.codigoCiudad, this.fecha, 1), null, null, usuario));
		}else{
			throw new UserException("Debe ingresar todos los datos solicitados");
		}
	}
	
	public void comprar() {
		try{
			operador.comprarAsiento(this.vueloSeleccionado, usuario);
			throw new UserException("El asiento "+this.vueloSeleccionado.codigo+" ha sido comprado exitosamente");
		}catch(AsientoNoDisponibleException e){
			throw new UserException("Ha ocurrido un error en su compra: "+e.errorMessage()+ "\n" + "Por favor intente nuevamente");
		}		
	}
	
	public void reservar() {
		try{
			operador.reservar(this.vueloSeleccionado, usuario);
			throw new UserException("El asiento "+this.vueloSeleccionado.codigo+" ha sido reservado exitosamente");
		}catch(AsientoNoDisponibleException e){
			throw new UserException("Ha ocurrido un error en su reserva: "+e.errorMessage()+ "\n" + "Por favor intente nuevamente");
		}
	}

	public void sobreReservar(){
		operador.sobreReservar(this.vueloSeleccionado, usuario);
	}
	
	//// Getters y Setters ////
	
	public Ciudad getOrigen() {
		return origen;
	}
	public void setOrigen(Ciudad unOrigen) {
		if(unOrigen == null){
			throw new UserException("Debe ingresar un origen");
		}
		else{
			this.origen = unOrigen;				
		}				
	}
	public Ciudad getDestino() {
		return destino;
	}
	public void setDestino(Ciudad unDestino) {
		if(unDestino == null){
			throw new UserException("Debe ingresar un destino");
		}else{
			this.destino = unDestino;	
		}
	}
	public String getFecha() {
		return fecha;
	}
	public void setFecha(String fecha) {
		if(!fecha.trim().isEmpty()){
			try{
				Latinoamericano latin = new Latinoamericano();
				latin.parsear(fecha);	
				this.fecha = fecha;
			}catch(NoEsParseablePorFormatoException e){
				throw new UserException("Ingrese una fecha valida. Detalle error: "+e.errorMessage());
			}
		}else{
			throw new UserException("Debe ingresar una fecha");
		}
	}
	public ArrayList<Vuelo> getResultados() {
		return resultados;
	}
	public void setResultados(ArrayList<Vuelo> resultados) {
		this.resultados = resultados;
	}
	public Vuelo getVueloSeleccionado() {
		return vueloSeleccionado;
	}
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public void setVueloSeleccionado(Vuelo vueloSeleccionado) {
		this.vueloSeleccionado = vueloSeleccionado;
	}
	
	//////////////////////////
}
